﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace ClickDiag
{
    /// <summary>
    /// Класс предназначен для вспомогательных целей. 
    /// Содержит функции являющиея собственностью компании Microsoft 
    /// </summary>
    static class SKUtils
    {
        /// <summary>
        /// Функция преобразует полное имя топика в уникальный GUID на основе Hash
        /// </summary>
        /// <param name="id">id топика</param>
        /// <returns>GUID топика</returns>
        public static string getIdName(string id)
        {
            HashAlgorithm md5 = HashAlgorithm.Create("MD5");
            byte[] input = Encoding.UTF8.GetBytes(id);
            byte[] output = md5.ComputeHash(input);
            Guid guid = new Guid(output);
            return (guid.ToString());
        }

        /// <summary>
        /// Функция преобразует полное имя топика в имя удобное для восприятия
        /// </summary>
        /// <param name="id">id топика</param>
        /// <returns>Удобное имя</returns>
        public static string getFriendlyName(string id)
        {
            string fileName = id.Replace(':', '_').Replace('<', '_').Replace('>', '_');

            if (fileName.IndexOf(".#ctor") != -1 && fileName.IndexOf("Overload") == -1)
            {
                fileName = "C_" + fileName.Substring(2);
                fileName = fileName.Replace(".#ctor", ".ctor");
            }
            else if (fileName.IndexOf(".#ctor") != -1 && fileName.IndexOf("Overload") != -1)
            {
                fileName = fileName.Replace("Overload", "O_T");
                fileName = fileName.Replace(".#ctor", ".ctor");
            }
            else if (fileName.IndexOf(".#cctor") != -1 && fileName.IndexOf("Overload") == -1)
            {
                fileName = "C_" + fileName.Substring(2);
                fileName = fileName.Replace(".#cctor", ".cctor");
            }
            else if (fileName.IndexOf(".#cctor") != -1 && fileName.IndexOf("Overload") != -1)
            {
                fileName = fileName.Replace("Overload", "O_T");
                fileName = fileName.Replace(".#cctor", ".cctor");
            }
            else if (fileName.IndexOf("Overload") != -1)
            {
                fileName = fileName.Replace("Overload", "O_T");
            }

            fileName = fileName.Replace('.', '_').Replace('#', '_');

            int paramStart = fileName.IndexOf('(');
            if (paramStart != -1)
            {
                fileName = fileName.Substring(0, paramStart) + GenerateParametersCode(id.Substring(paramStart));
            }

            return fileName;
        }

        private static string GenerateParametersCode(string parameterSection)
        {
            // TODO: figure out a consistent algorithm that works regardless of runtime version
            int code = parameterSection.GetHashCode();

            int parameterCount = 1;

            for (int count = 0; count < parameterSection.Length; count += 1)
            {
                int c = (int)parameterSection[count];

                if (c == ',')
                    ++parameterCount;
            }

            // format as (# of parameters)_(semi-unique hex code)
            return string.Format("_{1}_{0:x8}", code, parameterCount);
        }
    }
}
